import {getCosSTS, getOssSTS} from "@/api/tool/ossSTS";
import {isImage, isVideo} from "@/utils/ruoyi";
import request from "@/utils/request";

const COS = require('cos-js-sdk-v5');
export const cosUpload = async (file, fileName, callBackUp) => {
  const res = await getCosSTS();
  const { tmpSecretId, tmpSecretKey, sessionToken, startTime, expiredTime, bucket, region } = res.data;
  const cos = new COS({
    // 必选参数
    getAuthorization: (options, callback) => {
      const data = {
        TmpSecretId: tmpSecretId,
        TmpSecretKey: tmpSecretKey,
        XCosSecurityToken: sessionToken,
        StartTime: startTime, // 开始时间戳，单位秒
        ExpiredTime: expiredTime ,// 过期时间戳，单位秒
        ScopeLimit: true,
      }
      callback(data);
    }
  });
  // 上传图片
  return new Promise((resolve, reject) => {
    const date = new Date();
    const year = date.getFullYear();
    const month = (date.getMonth() + 1).toString().padStart(2, '0');
    const day = date.getDate().toString().padStart(2, '0');
    const timestamp = new Date().getTime().toString();
    const folderName = `${year}/${month}/${day}/${timestamp}-${fileName}`;

    cos.uploadFile({
      Bucket: bucket, /* 必须 */
      Region: region, /* 存储桶所在地域，必须字段 */
      Key: folderName, // 文件名
      Body: file, // 上传文件对象
      SliceSize: 1024 * 1024 * 5,
    onTaskReady: function(taskId) {
        // 用于中断分片上传回调
        callBackUp && callBackUp({cos, taskId})
      },
      onProgress: function (progressData) {
        console.log(JSON.stringify(progressData));
      },
      onFileFinish: function (err, data, options) {
        console.log(options.Key + '上传' + (err ? '失败' : '完成'));
      },
    }, (err, data) => {
      // 将上传后的封面进行路径拼接保存到本地
      resolve(data)
      reject(err)
    })
  });
}

const OSS = require('ali-oss')
export const ossUpload = async (file, fileName, callBackUp) => {
  const res = await getOssSTS()
  const { tmpSecretId, tmpSecretKey, sessionToken, startTime, expiredTime, bucket,region } = res.data
  const cos = new COS({
    // 必选参数
    getAuthorization: (options, callback) => {
      const obj = {
        TmpSecretId: tmpSecretId,
        TmpSecretKey: tmpSecretKey,
        XCosSecurityToken: sessionToken,
        StartTime: startTime, // 开始时间戳，单位秒
        ExpiredTime: expiredTime ,// 过期时间戳，单位秒
        ScopeLimit: true,
      }
      callback(obj)
    }
  })
  // 上传图片
  return new Promise((resolve, reject) => {
    const date = new Date();
    const year = date.getFullYear();
    const month = (date.getMonth() + 1).toString().padStart(2, '0');
    const day = date.getDate().toString().padStart(2, '0');
    const folderName = `${year}/${month}/${day}/${fileName}`;

    let headers = {};
    if (isImage(fileName)) {
      headers = {
        "Pic-Operations": '{"rules": [{"fileid": "/'+ folderName +'","rule": "imageMogr2/quality/50!"}]}'
      };
    }
    cos.uploadFile({
      Bucket: bucket, /* 必须 */
      Region: region, /* 存储桶所在地域，必须字段 */
      Key: folderName, // 文件名
      Body: file, // 上传文件对象
      SliceSize: 1024 * 1024 * 5,
      Headers: headers,
      onTaskReady: function(taskId) {
        // 用于中断分片上传回调
        callBackUp && callBackUp({cos, taskId})
      },
      onProgress: function (progressData) {
        console.log(JSON.stringify(progressData));
      },
      onFileFinish: function (err, data, options) {
        console.log(options.Key + '上传' + (err ? '失败' : '完成'));
        // 上传的是视频则提交转码任务
        if(isVideo(folderName)){
          postTranscode(bucket, region, folderName);
        }
      },
    }, (err, data) => {
      // 将上传后的封面进行路径拼接保存到本地
      resolve(data)
      reject(err)
    })
  });

  function postTranscode(bucket, region, folderName) {
    // sdk引入以及初始化请参考：https://cloud.tencent.com/document/product/436/8629
    const config = {
      // 需要替换成您自己的存储桶信息
      Bucket: bucket, // 存储桶，必须字段
      Region: region, // 存储桶所在地域，必须字段 如 ap-beijing
    };
    const key = `jobs`; // 固定值，必须
    const host = `${bucket}.ci.${region}.myqcloud.com`;
    const url = `https://${host}/${key}`;
    const body = COS.util.json2xml({
      Request: {
        // 创建任务的Tag：Transcode;是否必传：是
        Tag: 'Transcode',
        // 待操作的文件信息;是否必传：是
        Input: {
          // 文件路径;是否必传：是
          Object: "/" + folderName,
        },
        // 操作规则;是否必传：是
        Operation: {
          // TemplateId与Transcode 二选一传入
          // 转码模板 ID;是否必传：否，可通过控制台获取
          //TemplateId: 'xxx',
          // 转码模板参数;是否必传：否
          Transcode: {
            Container: {
              Format: 'mp4'
            },
            Video: {
              Fps:  '20',
              Profile: 'baseline'
            },
            Audio: {
              Codec: 'aac'
            },
          },
          // 结果输出配置;是否必传：是
          Output: {
            // 存储桶的地域;是否必传：是
            Region: region,
            // 存储结果的存储桶;是否必传：是
            Bucket: bucket,
            // 输出结果的文件名;是否必传：是
            Object: "/" + folderName,
          },
        },
      },
    });

    cos.request(
      {
        Method: 'POST', // 固定值，必须
        Key: key, // 必须
        Url: url, // 请求的url，必须
        Body: body, // 请求体参数，必须
        ContentType: 'application/xml', // 固定值，必须
      },
      function (err, data) {
        if (err) {
          // 处理请求失败
          console.log(err);
        } else {
          // 处理请求成功
          console.log(data.Response);
        }
      }
    );
  }
}

